{"componentChunkName":"component---src-templates-studio-page-js","path":"/studio/novus","webpackCompilationHash":"0f979b9b09e9513b4912","result":{"data":{"site":{"siteMetadata":{"keywords":["blog","ubug","tech blog","技术博客","playground"]}},"mdx":{"fields":{"title":"💾 数据管理层 NOVUS","noFooter":false,"description":"React、TypeScript 友好、不需要模板代码、集中式的数据模型、心智简单、足够使用。","date":"2021-09-07","author":"Ubug","banner":{"childImageSharp":{"fluid":{"tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='458'%3e%3cpath%20d='M0%20229v229h401V0H0v229m4-42l-1%206c0%205%200%205%203%205%202%200%203%200%203%202-1%201%200%202%203%202%206%201%2011%200%2012-2l-1-1H13l3-1c2%200%203-1%203-4v-3h-7c-7%200-7%200-7-3l-1-1m32%200l1%203c2%201%2010%200%2011-1l1-1%201%201c-1%202%2022%201%2024%200h1l3%201h5c1%202%202%201%202-1s0-2-3-2h-3a213%20213%200%2000-41%201c1-1%200-2-1-2l-1%201m218%20148c-1%208-1%209%201%209l3%201c-1%203%200%203%206%203s9-2%204-3l-2-3c0-3%200-3-5-3l-6-1h5c4%200%205%200%205-2l-5-1h-6m26%200v2h11l13%201h14c1%201%202%200%203-2l-3-1h-38M4%20381l33%201a329%20329%200%2000-33-1m31%2026'%20fill='%23573ede'%20fill-rule='evenodd'/%3e%3c/svg%3e","aspectRatio":0.8738019169329073,"src":"/static/45d9c42628d00ab84c2572b13ba14338/fbb15/novus.png","srcSet":"/static/45d9c42628d00ab84c2572b13ba14338/82675/novus.png 500w,\n/static/45d9c42628d00ab84c2572b13ba14338/fef60/novus.png 1000w,\n/static/45d9c42628d00ab84c2572b13ba14338/fbb15/novus.png 1094w","srcWebp":"/static/45d9c42628d00ab84c2572b13ba14338/f71dc/novus.webp","srcSetWebp":"/static/45d9c42628d00ab84c2572b13ba14338/7fe04/novus.webp 500w,\n/static/45d9c42628d00ab84c2572b13ba14338/d619e/novus.webp 1000w,\n/static/45d9c42628d00ab84c2572b13ba14338/f71dc/novus.webp 1094w","sizes":"(max-width: 1094px) 100vw, 1094px"}}},"noGlobalStyles":false,"bannerCredit":null,"slug":"/studio/novus","tags":["novus","model"]},"body":"const _excluded = [\"components\"];\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n/* @jsx mdx */\n\nconst _frontmatter = {\n  \"slug\": \"novus\",\n  \"title\": \"💾 数据管理层 NOVUS\",\n  \"tech\": \"javascript\",\n  \"date\": \"2021-09-07 22:50:20\",\n  \"description\": \"React、TypeScript 友好、不需要模板代码、集中式的数据模型、心智简单、足够使用。\",\n  \"titleColor\": \"#dcdcdc\",\n  \"btnStyle\": \"darkBlue\",\n  \"contentPadding\": \"3% 10% 0\",\n  \"tags\": [\"novus\", \"model\"],\n  \"banner\": \"../studios/novus.png\"\n};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n  console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\");\n  return mdx(\"div\", props);\n};\nconst CodeWithPreview = makeShortcode(\"CodeWithPreview\");\nconst SourceCodeLink = makeShortcode(\"SourceCodeLink\");\nconst layoutProps = {\n  _frontmatter\n};\nconst MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  let {\n      components\n    } = _ref,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"hr\", null), mdx(\"p\", null, \"\\u76F8\\u5173\\u6587\\u7AE0\\uFF1A\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"/blog/novus\"\n  }, \"\\uD83D\\uDCE6 \\u5B9E\\u73B0\\u4E00\\u4E2A\\u7B80\\u5355\\u6734\\u7D20\\u7684 react \\u6570\\u636E\\u7BA1\\u7406\\u5C42 NOVUS\"), \"\\uFF0C\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"/blog/novus-2\"\n  }, \"\\uD83D\\uDCE6 \\u6539\\u8FDB\\u4E00\\u4E2A\\u7B80\\u5355\\u6734\\u7D20\\u7684 react \\u6570\\u636E\\u7BA1\\u7406\\u5C42 NOVUS\")), mdx(\"p\", null, \"\\u8F83\\u5927\\u578B\\u5E94\\u7528\\uFF1A\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"/blog/workpad-part-1\"\n  }, \"\\uD83C\\uDF0B WebIDE \\u7684\\u5F00\\u53D1\\u8BB0\\u5F55\\u5176\\u4E00\\uFF08\\u524D\\u8A00\\u548C\\u6982\\u89C8\\uFF09\")), mdx(\"hr\", null), mdx(\"p\", null, \"\\u96C6\\u4E2D\\u7BA1\\u7406\\u6570\\u636E\\u72B6\\u6001\\u6A21\\u578B\\uFF0C\\u5E76\\u4E14\\u4EAB\\u53D7 TypeScript \\u7684\\u4FBF\\u5229\\uFF0C\\u4ECE\\u660E\\u5929\\u8D77\\uFF0C\\u505A\\u4E00\\u4E2A\\u5E78\\u798F\\u7684\\u4EBA\\uFF0C\\u4E0D\\u53BB\\u5173\\u5FC3\\u540C\\u6B65\\u5F02\\u6B65\\u3001\\u4E0D\\u53BB\\u5173\\u5FC3\\u4E00\\u4E2A\\u903B\\u8F91\\u5199\\u591A\\u5904\\u3001\\u4E0D\\u53BB\\u5173\\u5FC3\\u590D\\u6742\\u7684\\u5FC3\\u667A\\u6A21\\u578B\\u3001\\u4E0D\\u53BB\\u5173\\u5FC3\\u4E0D\\u53EF\\u63A8\\u65AD\\u7684\\u8FD0\\u884C\\u65F6\\u9519\\u8BEF\\u3002\\u4ECE\\u4ECA\\u4EE5\\u540E\\u7B80\\u5355\\u70B9\\uFF0C\\u53EA\\u5173\\u5FC3\\u6570\\u636E\\u548C\\u53D8\\u66F4\\uFF0C\\u53EA\\u4F7F\\u7528\\u4EE3\\u7801\\u63D0\\u793A\\uFF0C\\u5C31\\u6B64\\u4E00\\u751F\\uFF0C\\u5B8C\\u6210\\u9879\\u76EE\\u3002\"), mdx(\"p\", null, \"\\u70B9\\u51FB\\u6309\\u94AE\\u5C1D\\u8BD5 demo\\uFF1A\"), mdx(CodeWithPreview, {\n    withTitle: true,\n    preview: mdx(ExampleTodoExample, {\n      mdxType: \"ExampleTodoExample\"\n    }),\n    mdxType: \"CodeWithPreview\"\n  }), mdx(\"h2\", null, \"\\u4EE3\\u7801\"), mdx(SourceCodeLink, {\n    url: \"https://cnb.cool/ubug/novus/novus\",\n    name: \"NOVUS\",\n    desc: \"\\uD83D\\uDCE6 \\u5B9E\\u73B0\\u4E00\\u4E2A\\u7B80\\u5355\\u6734\\u7D20\\u7684 react \\u6570\\u636E\\u7BA1\\u7406\\u5C42\",\n    mdxType: \"SourceCodeLink\"\n  }), mdx(\"hr\", null), mdx(\"p\", null, \"\\u4F7F\\u7528\\u8303\\u4F8B\\uFF1A\"), mdx(CodeWithPreview, {\n    column: true,\n    titleBar: \"novus.tsx\",\n    codes: [{\n      name: \"example1.ts\",\n      code: novus_studio_novusCodeStr\n    }, {\n      name: \"example2.ts\",\n      code: novus_studio_novusCodeStr1\n    }, {\n      name: \"example3.ts\",\n      code: novus_studio_novusCodeStr2\n    }],\n    withTitle: true,\n    mdxType: \"CodeWithPreview\"\n  }));\n}\n;\nMDXContent.isMDXComponent = true;"}},"pageContext":{"isCreatedByStatefulCreatePages":false,"id":"55b1090c-b6a1-51f5-91a3-f9c05a8ae594","prev":{"fileAbsolutePath":"D:/ubug/storybook/content/studio/common/rocket.md","id":"b5ec66f8-b7e3-58ca-b834-10ab7861d20c","parent":{"name":"rocket","sourceInstanceName":"studio"},"excerpt":"预览可以到  火箭着陆","fields":{"title":"🚀 火箭着陆","slug":"/studio/rocket","description":"Threejs + Cannonjs 实现的一个3D火箭自动着陆，火箭发射，LowPoly 风格画面。","date":"2021-10-03","redirects":null,"datetime":"2021-10-03 16:34:10","categories":[],"series":null,"tags":["talking"],"status":"online"},"frontmatter":{"published":null,"tags":["talking"],"theme":null,"slug":"rocket","date":"2021-10-03 16:34:10"},"body":"const _excluded = [\"components\"];\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n/* @jsx mdx */\n\nconst _frontmatter = {\n  \"slug\": \"rocket\",\n  \"title\": \"🚀 火箭着陆\",\n  \"tech\": \"other\",\n  \"date\": \"2021-10-03 16:34:10\",\n  \"description\": \"Threejs + Cannonjs 实现的一个3D火箭自动着陆，火箭发射，LowPoly 风格画面。\",\n  \"titleColor\": \"#774934\",\n  \"btnStyle\": \"darkBlue\",\n  \"tags\": [\"talking\"],\n  \"banner\": \"../studios/rocket.png\"\n};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n  console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\");\n  return mdx(\"div\", props);\n};\nconst layoutProps = {\n  _frontmatter\n};\nconst MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  let {\n      components\n    } = _ref,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"\\u9884\\u89C8\\u53EF\\u4EE5\\u5230 \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://app.ubug.io/rocket\"\n  }, \"\\u706B\\u7BAD\\u7740\\u9646\")));\n}\n;\nMDXContent.isMDXComponent = true;"},"next":{"fileAbsolutePath":"D:/ubug/storybook/content/studio/common/fishes.md","id":"37c77187-30e7-5f5a-a575-73533655f8ed","parent":{"name":"fishes","sourceInstanceName":"studio"},"excerpt":"预览可以到  鱼塘","fields":{"title":"🐠 小鱼塘","slug":"/studio/fishes","description":"一个小鱼儿自由晃荡的海底小世界，喜欢的话可以逗逗它们。你也可以扔个瓶子，捞个瓶子玩。","date":"2021-06-20","redirects":null,"datetime":"2021-06-20 16:34:10","categories":[],"series":null,"tags":["talking"],"status":"online"},"frontmatter":{"published":null,"tags":["talking"],"theme":null,"slug":"fishes","date":"2021-06-20 16:34:10"},"body":"const _excluded = [\"components\"];\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n/* @jsx mdx */\n\nconst _frontmatter = {\n  \"slug\": \"fishes\",\n  \"title\": \"🐠 小鱼塘\",\n  \"tech\": \"other\",\n  \"date\": \"2021-06-20 16:34:10\",\n  \"description\": \"一个小鱼儿自由晃荡的海底小世界，喜欢的话可以逗逗它们。你也可以扔个瓶子，捞个瓶子玩。\",\n  \"titleColor\": \"#063362\",\n  \"btnStyle\": \"lightYellow\",\n  \"tags\": [\"talking\"],\n  \"banner\": \"../studios/fishes.png\"\n};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n  console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\");\n  return mdx(\"div\", props);\n};\nconst layoutProps = {\n  _frontmatter\n};\nconst MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  let {\n      components\n    } = _ref,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"\\u9884\\u89C8\\u53EF\\u4EE5\\u5230 \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://app.ubug.io/fishtank/#0\"\n  }, \"\\u9C7C\\u5858\")));\n}\n;\nMDXContent.isMDXComponent = true;"}}}}